The activation handler of a notification may indirectly have already
destroyed it before `activate()` continues and tries to destroy it.
This happened for example in the `FdoNotificationDaemon` activation
handler when no default actions are specified, which ends up calling
`destroyNonResidentNotifications()`.
Another case where this could happen is the `WindowAttentionHandler`
which activates the window and upon activation of the window destroys
the entire notification source, which also destroys the notification.
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5421
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4113>
}
activate() {
+ console.assert(!this._destroyed, 'Activating a destroyed notification');
+
this.emit('activated');
+ // Avoid double destruction after activation
+ if (this._destroyed)
+ return;
+
// We don't hide a resident notification when the user invokes one of its actions,
// because it is common for such notifications to update themselves with new
// information based on the action. We'd like to display the updated information
destroy(reason = NotificationDestroyedReason.DISMISSED) {
this.emit('destroy', reason);
+ this._destroyed = true;
+
if (this._updateDatetimeId)
GLib.source_remove(this._updateDatetimeId);
delete this._updateDatetimeId;